<?php
/**
 * @author Artur Bier <izatop@gmail.com>
 * @package Application.Event
 *
 * @copyright TinyWEB CMS
 * @link http://tinywebcms.ru
 * @link http://cms.vingrad.ru
 * @version SVN: $Id$ 
 */

/**
 * @example
 * 		ApplicationController::attachEventListener(array(new ApplicationNameController(), 'method'), array($_POST, 'Submit));
 * 
 */
class ApplicationEventListener extends Object 
{
    /**
     * Object listener
     *
     * @var Object
     */
    protected $object;
    
    /**
     * Method of given listener
     *
     * @var string
     */
    protected $method;
    
    /**
     * Listen datasource
     *
     * @var mixed
     */
    protected $datasource;
    
    /**
     * Index of datasource
     *
     * @var mixed
     */
    protected $event;
    
    /**
     * Event construction
     *
     * @param Object $object
     * @param string $method
     * @param mixed $datasource
     * @param mixed $event
     */
    final public function __construct($object, $method, $datasource, $event = null)
    {
        $this->object = $object;
        $this->method = $method;
        $this->datasource = $datasource;
        $this->event = $event;
    }
    
    /**
     * Возвращает объект события
     *
     * @return Object
     */
    public function getListener()
    {
        return $this->object;
    }
    
    /**
     * Возвращет метод обработчика события.
     *
     * @return string
     */
    public function getMethod()
    {
        return $this->method;
    }
    
    /**
     * Проверяет случилось ли событие.
     *
     * @return boolean
     */
    public function isEventHappened()
    {
        return ($this->datasource &&
            (
                (is_array($this->datasource) && $this->event && array_key_exists($this->event, $this->datasource)) ||
                (is_array($this->datasource) && sizeof($this->datasource) && !$this->event)
            )
        ) ? true : false;
    }
    
    /**
     * Вызывает метод экземпляра класса обработчика собтия.
     *
     */
    public function call()
    {
        call_user_func(array($this->object, $this->method), array());
    }
    
    /**
     * Уничтожает обработчик события.
     *
     */
    public function dispatch()
    {
        ApplicationController::dispatchEventListener($this);
    }
    
    // static zone
}

?>